﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;

namespace ConsoleApp11
{
    internal class BaseUnit
    {
        //定义基本对象类型的属性   public公用属性  不加会变成私有属性

        //定义一下类的名称属性 进行区分

        public String Name = "张大炮";

        //生物的血量 姓名 攻击力  unit 无符号整型
        public uint MaxHP = 100; //定义最大生命值  
        public uint CurrentHp = 100;//当前生命值

        //攻击力   int  可以变成负数
        public int Attack = 10;//基础攻击力
        public int Defence = 1;//防御力  没一点防御力可以减少0.5的攻击力伤害
        public uint lever = 1; //基础初始化等级
        public uint CurrentExp = 0;//初始化经验值
        private string TestString = "测试文案";
        public void ConsoleTtestString()
        {
            Console.WriteLine(TestString);
        }
        //程序意义上的属性
        //属性定义使用大括号
        public uint NeedExp
        {
            //定义属性的设置和获取  get set
            //设置
            get
            {
                //设置的等级经验应该由当前等级进行计算 不需要被外部设定为多少经验
                //目前设计的经验为100+25*当前的等级
                return 100 + 25 * lever;
            }
            //set { }
        }

        //构造函数  初始化对象时候 的初始值
        public BaseUnit()
        {
            Console.WriteLine("BaseUnit的构造函数");
            //基础构造函数  什么也没有
            //程序会自动执行上述默认值
        }
        //带参函数
        public BaseUnit(string name, uint maxhp, uint currenthp, int atk, uint lv)
        {
            //带参构造函数  初始化一些自定义事情  生成一个不一样的对象
            Name = name;
            MaxHP = maxhp;
            CurrentHp = currenthp;
            Attack = atk;
            lever = lv;
        }
        //定义函数来打印当前角色的属性只用于打印属性
        /// <summary>
        /// 打印基本属性用
        /// </summary>
        public void ConsoleMyData()
        {
            //多次打印string  内存很差的处理 直接使用stringBuild进行拼接
            StringBuilder builder = new StringBuilder();
            builder.Append($"{Name} : ");
            builder.Append($"\n{lever}级  经验{CurrentExp}/{NeedExp}");
            builder.Append($"\n生命{CurrentHp}/{MaxHP}");
            builder.Append($"\n攻击力{Attack} ");
            Console.WriteLine(builder.ToString());
        }
        //定义接受伤害的方法函数
        /// <summary>
        /// 自身防御力抵扣伤害来源  然后在血量扣除实际伤害
        /// </summary>
        /// <param name="other"></param>
        public void GetDamage(BaseUnit other)
        {
            //先计算实际减少的伤害值  收到攻击对象的攻击力减去防御力抵扣的伤害
            uint damage = (uint)(other.Attack - 0.5f * Defence);
         
            if (CurrentHp <=damage) {
                Console.WriteLine($"{other.Name}对{Name}造成了{damage}点伤害");
                CurrentHp = 0; 
            } else {
                CurrentHp -= damage;
                //unit的取值类型问题做出一个判断
                Console.WriteLine($"{other.Name}对{Name}造成了{damage}点伤害，{Name}剩余{CurrentHp}生命值");
            }
            
            //受到伤害后怪物死亡 玩家会获取经验
            if (CurrentHp <=0)
            {
                Console.WriteLine($"{Name}被{other.Name}击杀了");

                //击杀方获取经验 根据等级来获取
                //获取最大经验值为等级*15  再扣除等级差*3  最少获取1点
                uint getexp = this.lever * 15;
                //低等级击杀高等级获得额外经验 other.lever-this.lever
                if (other.lever==this.lever)
                {
                    getexp = this.lever * 15;
                }
                else if(other.lever>this.lever)
                {
                    getexp = this.lever * 20;
                }
                else if (other.lever < this.lever)
                {
                    if ((this.lever - other.lever)>5)
                    {
                        getexp = 1;
                    }
                    else
                    {
                        getexp -= (other.lever - this.lever) * 3;
                    }
                }

              
                other.GetExp(getexp);
            }
        }
        /// <summary>
        /// 技能
        /// </summary>
        /// <param name="other"></param>
        public void GetDamage2(BaseUnit other)
        {
            //先计算实际减少的伤害值  收到攻击对象的攻击力减去防御力抵扣的伤害
            uint damage = (uint)(other.Attack*2 - 0.5f * Defence);

            if (CurrentHp <= damage)
            {
                Console.WriteLine($"{other.Name}释放技能《馒歌会》对{Name}造成了{damage}点伤害");
                CurrentHp = 0;
            }
            else
            {
                CurrentHp -= damage;
                //unit的取值类型问题做出一个判断
                Console.WriteLine($"{other.Name}释放技能《馒歌会》对{Name}造成了{damage}点伤害，{Name}剩余{CurrentHp}生命值");
            }

            //受到伤害后怪物死亡 玩家会获取经验
            if (CurrentHp <= 0)
            {
                Console.WriteLine($"{Name}被{other.Name}击杀了");

                //击杀方获取经验 根据等级来获取
                //获取最大经验值为等级*15  再扣除等级差*3  最少获取1点
                uint getexp = this.lever * 15;
                //低等级击杀高等级获得额外经验 other.lever-this.lever
                if (other.lever == this.lever)
                {
                    getexp = this.lever * 15;
                }
                else if (other.lever > this.lever)
                {
                    getexp = this.lever * 20;
                }
                else if (other.lever < this.lever)
                {
                    if ((this.lever - other.lever) > 5)
                    {
                        getexp = 1;
                    }
                    else
                    {
                        getexp -= (other.lever - this.lever) * 3;
                    }
                }


                other.GetExp(getexp);
            }
        }

        public void Restoration(BaseUnit other) {
            other.CurrentHp += (uint)(other.Attack);
            Console.WriteLine($"{other.Name}恢复了，{other.Name}剩余{other.CurrentHp}生命值");
        }
        public void GetExp(uint exp)
        {
            Console.WriteLine($"{Name}获得了{exp}经验");
            CurrentExp += exp;
            //当前经验大于当前等级最大经验值后 自动升级
            LeverUp();
        }
        //升级经验的处理函数
        private void LeverUp()
        {
            if (CurrentExp < NeedExp)
            {
                return;
            }
            //升级后的逻辑
            CurrentExp -= NeedExp;
            lever++;
            Attack += 5;//升一级攻击力增加
            CurrentHp = MaxHP = 50 + 75 * lever;//血量升级重置最大
            Defence = (int)(lever * 0.5 + 1);
            Console.WriteLine($"恭喜升级了，当前等级为{lever}级");

            //进行递归重复升级
            LeverUp();

        }
    }
}
